/**
 * 
 */
package com.woniuxy.amusementparkos.permission.Service.impl;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.woniuxy.amusementparkos.dao.fzw.UserDao;
import com.woniuxy.amusementparkos.dao.fzw.UserManagementDao;
import com.woniuxy.amusementparkos.entity.fzw.Menu;
import com.woniuxy.amusementparkos.entity.fzw.Role;
import com.woniuxy.amusementparkos.entity.fzw.User;
import com.woniuxy.amusementparkos.permission.Service.UserManagementService;
import com.woniuxy.amusementparkos.service.fzw.UserService;

/**
 *
 * @author fzw
 *
 * 2020年4月26日下午8:52:32
 */
@Service
public class UserManagementServiceImp implements UserManagementService {
	@Autowired
	UserManagementDao userManagementDao;
	@Autowired
	UserDao userDao;
	
	@Override
	public List<User> selectAllUserByPageNumber(Integer curr, Integer limit) {
	    List<User> users=userManagementDao.selectAllUserByPageNumber((curr-1)*10,limit);
		return users;
	}

	// 启用事务控制
	@Transactional
	@Override
	public void updataUser(User user) throws RuntimeException{
		//修改主表，这里可以直接修改的好处是因为建立了关联表的关系
		userManagementDao.updataUser(user);
		//再修改用户关联表中的：用户&角色关联表
		//根据user对象存放的Role对象集合中的role_id来依次更新用户与角色对应关系
		//提取user中的Role集合，并拿到role_id
		//先删再添加修改的用户&角色信息
		userManagementDao.deleteUserAndRoleByUserId(user.getUser_id());
		//先删再添加修改的用户&菜单信息
		userManagementDao.deleteUserAndMenuByUserId(user.getUser_id());
		//再重新添加
		for(Role role:user.getRoles()) {
			userManagementDao.insertUserAndRoleByUserId(user.getUser_id(), role.getRole_id());
		}
		//再重新添加
		for(Menu menu:user.getMenus()) {
			userManagementDao.insertUserAndMenuByUser_id(user.getUser_id(), menu.getMenu_id());
		}
		
	}

/**
 * 后台添加用户
 */
	//事务控制
	@Transactional
	@Override
	public void insertUser(User user) {
		//验证用户名是否存在，考虑到同名同姓，这里不验证真实姓名account
		User realuser = userDao.selectOneUserByName(user.getUsername());
		if(realuser!=null) {
			throw new RuntimeException("用户名已存在，请更换用户名");
		}
		//密码加密
		//返回值：[0]:盐 [1]:加密的密码
		String[] encryptPassword = UserService.encryptPassword(user.getUsername(), user.getPassword());
		user.setSalt(encryptPassword[0]);
		user.setPassword(encryptPassword[1]);
		//注册
		userManagementDao.insertUser(user);
		//注册后用户关联角色表
		List<Integer> role_ids = new ArrayList<Integer>();
		for(Role role : user.getRoles()) {
			role_ids.add(role.getRole_id());
		}
		//注册后用户关联菜单表
		List<Integer> menu_ids = new ArrayList<Integer>();
		for(Menu menu : user.getMenus()) {
			menu_ids.add(menu.getMenu_id());
		}
		//重新查询注册后的该用户ID，以便注册关联角色表和菜单表
		//注意，其实可以在注册insert时就返回主键ID的，但是由于Mysql的限制，一张表可能多人操作
		//这种方式有可能返回的ID不是实际的ID，重新查询是最准确的
		User registerUser = userDao.selectOneUserByName(user.getUsername());
		userManagementDao.insertUserAndRoleByUserId2(registerUser.getUser_id(), role_ids);
		userManagementDao.insertUserAndMenuByUserId(registerUser.getUser_id(), menu_ids);
	}
	
//批量删除用户时启动事务
//将用户表关联的 角色表、组织表信息也删除
@Transactional
@Override
public void deleteUsersByIds(ArrayList<Integer> uids) {
	//根据用户id批量删除用户关联的角色信息
	userManagementDao.deleteUserRoleByIds(uids);
	//根据用户id批量删除用户关联的菜单
	for(Integer user_id:uids) {
		userManagementDao.deleteUserAndMenuByUserId(user_id);
	}
	//根据用户id批量删除用户表主信息
	userManagementDao.deleteUsersByIds(uids);
}

/**
 * 查询总页数
 */
@Override
public Long selectCount() {
	return userManagementDao.selectCount();
}

}
